﻿#ifndef TASKMANAGER_H
#define TASKMANAGER_H

#include <QObject>
#include <QDomDocument>

#include "taskitem.h"
#include "styleitem.h"
#include <QSettings>
#include <QDir>
#include<QVector>
#include <QCoreApplication>
#include "f4cagrinstrument.h"
#include "notify.h"
#include "instrumentbase.h"
#include"f4bagrinstrument.h"
#include"f4testimatrument.h"
/**
 * @brief The TaskManager class 单例模式，任务管理器，管理任务数据，不包含任何界面类内容
 */
//指令间隔时间   和区域扫描之前快指稳定段时间
extern double instructionIntervalTime;
extern double stableTime;
extern double LoopTime;
extern double FulldiskstableTime;
extern double ChinaScanstableTime;
extern double MidReginstableTime;
extern double pretime;
extern double afttime;
extern int FulldiskpreSpace;
extern int ChinascanpreSpace;
extern double fulldispreangle;

struct regionInfo
{
    double midx;
    double midy;
    double widget;
    double height;
    int cycleNum;
};

////加一个regioninfos ，当有midregion对象被创建，就把前一个regioninfo保存，然后在保存到
////配置文件的时候，把regioninfos中的regioninfo保存，把最后一个未保存的region保存。
//思考：这样做修改，会不会对删除任务的时候产生影响？有影响，
//在加载任务后，编辑任务的时候，如何从配置文件中找到对应的信息，显示？
//解答：从根节点中用计数的方式，将中尺度的大任务userrole保存，然后从配置文件中，找到对应的读取进来的数据。
//那么读取进来保存的时候，就也要修改

//new：在存进去的时候，就要和中尺度根节点对应起来。那么在存的时候，我还没有创建任务，无法和根节点对应。
//解决：在taskitemtree中加userrole 然后在创建任务的时候保存。
//编辑任务的时候，任务已经存在了，就可以加userrole了，在编辑的时候通过task的userrole在region中找到对应的区域信息，显示。
//有修改的话是否可行？答：如果已经有userrole就修改，如果没有的话，就加上。任务层面会不会有影响？

class TaskManager : public QObject
{
    Q_OBJECT

private:
    explicit TaskManager(QObject *parent = 0);

public:
    static TaskManager* getInstance();

    QString curIns();
    //0826用于修改中尺度问题
    QVector<regionInfo> mvctregion;
    void setcurMidNum(int num);
    int getcurMidNum();
    void removecurMidNum(int num);

    QVector<QVector<regionInfo>> allregionInfos;

    void loadItemFile(const QDomElement& node);
    void saveItemFile(QDomDocument doc,QDomElement node);

    QVector<TaskItem* > allTasks();
    TaskItem* addTask(const QString& sName);
    bool removeTask(const QString& objName);
    TaskItem* getTask(const QString& objName);

    /**
     * @brief getSortCommand 对所有任务的所有指令，按照开始时间排序
     * @return
     */
    QVector<CommandItem* > getSortCommand();

    void loadStyleFile();
    void saveStyleFile();

    StyleItem* addStyle(QString sName);
    StyleItem* getStyle(const QString& sName);
    QVector<StyleItem*> allStyles();
    bool removeStyle(const QString& sName);
    void updateStyle(const QString& sName);

    InstrumentBase* currentInstrument();

    // NOTIFY
    void registNotify(Notify* p);

signals:

public slots:
    void slot_updateTask(QString taskObj, QString cmdObj, QString scriptObj);
    void slot_commandSelect(const QString &cmdObj);


private:
    static TaskManager* mInstance;
    QString mInsType;// 当前规划的载荷
    QVector<TaskItem*> mvctTasks;
    QVector<StyleItem*> mvctStyles;

    InstrumentBase* mpInstrument;
    QVector<Notify* > mvctNotify;

    int CurEidtMidNum;

};

#endif // TASKMANAGER_H
